#ifndef DRV_GPIO_H
#define DRV_GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

#include "public.h"


#define __STM32_PORT(port)  GPIO##port##_BASE
#define GET_PIN(PORTx,PIN) (int)((16 * ( ((int)__STM32_PORT(PORTx) - (int)GPIOA_BASE)/(0x0400UL) )) + PIN)
#if defined(SOC_SERIES_STM32F1)
    #define GPIO_PORT_BASE(port)  ((GPIO_TypeDef *)(GPIOA_BASE + 0x400U * (port)))
#elif defined(SOC_SERIES_STM32F4)
    #define GPIO_PORT_BASE(port)  ((GPIO_TypeDef *)(GPIOA_BASE + 0x400U * (port)))
#else
    #error "Please define STM32F1xx or STM32F4xx"
#endif

/* 模式定义 */
#define PIN_MODE_INPUT         0
#define PIN_MODE_OUTPUT        1
#define PIN_MODE_INPUT_PULLUP  2
#define PIN_MODE_INPUT_PULLDOWN 3



/**
 * @brief 设置引脚模式
 * @param pin 通过GET_PIN宏获得的引脚号
 * @param mode PIN_MODE_INPUT/PIN_MODE_OUTPUT/PIN_MODE_INPUT_PULLUP/PIN_MODE_INPUT_PULLDOWN
 */
void pin_mode(uint32_t pin, uint32_t mode);

/**
 * @brief 设置引脚输出电平
 * @param pin 通过GET_PIN宏获得的引脚号
 * @param value 0:低电平 1:高电平
 */
void pin_set(uint32_t pin, uint8_t value);

/**
 * @brief 读取引脚输入电平
 * @param pin 通过GET_PIN宏获得的引脚号
 * @return 0:低电平 1:高电平
 */
uint8_t pin_get(uint32_t pin);

#ifdef __cplusplus
}
#endif

#endif // DRV_GPIO_H